package com.hyt.it.ogt.kq.common.gov.utils.timeslot;

import java.time.LocalDateTime;

/**
 * 时间段工具类
 */
public class TimeslotUtil {

    /**
     * 判断两个时间段是否重叠
     * @param slot1
     * @param slot2
     * @return
     */
    public static boolean overlapped(Timeslot slot1, Timeslot slot2) {
        Timeslot previous, next;
        previous = slot1.getStartTime().isBefore(slot2.getStartTime()) ? slot1 : slot2;
        next = slot2.getStartTime().isAfter(slot1.getStartTime()) ? slot2 : slot1;
        // 这里业务需要，允许时间点的重叠
        // 例如某个时间段的起始时间：2020-06-29 00:00:00
        // 和另一个时间段的终止时间：2020-06-29 00:00:00
        // 它们俩可以有交点。如果不需要这种逻辑只把le改成lt
        // ，ge改成gt就可
        //return !(le(previous, next) || ge(previous, next));
        return !(lt(previous, next) || gt(previous, next));
    }

    /**
     * 构造一个时间段
     * @param startTime 起始时间
     * @param endTime 结束时间
     * @return 时间段
     */
    public static Timeslot buildSlot(LocalDateTime startTime, LocalDateTime endTime) {
        return new Timeslot(startTime, endTime);
    }

    /**
     * less equal
     * 小于等于
     * @param prev
     * @param next
     * @return
     */
    private static boolean le(Timeslot prev, Timeslot next) {
        return lt(prev, next) || next.getEndTime().isEqual(prev.getStartTime());
    }

    /**
     * greater equal
     * 大于等于
     * @param prev
     * @param next
     * @return
     */
    private static boolean ge(Timeslot prev, Timeslot next) {
        return gt(prev, next) || prev.getEndTime().isEqual(next.getStartTime());
    }

    /**
     * greater than
     * 大于
     * @param prev
     * @param next
     * @return
     */
    private static boolean gt(Timeslot prev, Timeslot next) {
        return prev.getEndTime().isBefore(next.getStartTime());
    }

    /**
     * less than
     * 小于
     * @param prev
     * @param next
     * @return
     */
    private static boolean lt(Timeslot prev, Timeslot next) {
        return next.getEndTime().isBefore(prev.getStartTime());
    }

}
